﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//设计一个小程序来判断当前机器的字节序
//int main()
//{
//	//int a = 0x11 22 33 44;
//	//大端存储：低位放高地址处，11 22 33 44
//	//小端存储：低位放低地址处，44 33 22 11
//
//	int a = 1;//大端00 00 00 01
//
//	return 0;
//}

//数据类型决定了存储的方式
//int main()
//{
//	int a = 10;//4
//	float f = 10.0;//4
//
//	return 0;
//}


//原码，反码，补码的介绍
//int main()
//{
//	int a = 20;//4个字节-32bit
//	//原码：00000000 00000000 00000000 00010100
//	//反码：00000000 00000000 00000000 00010100
//	//补码：00000000 00000000 00000000 00010100
//	int b = -10;
//	//原码:10000000 00000000 00000000 00001010
//	//反码:11111111 11111111 11111111 11110101
//	//补码:11111111 11111111 11111111 11110110
//	
//	return 0;
//}


//补码的意义
//int main()
//{
//	 1 - 1;
//	//1 + (-1)
//	// 
//	//1的原码00000000 00000000 00000000 00000001
//	//-1的原码10000000 00000000 00000000 00000001
//	//直接相加10000000 00000000 00000000 00000010 --> -2 错误
//
//	//-1的原码10000000 00000000 00000000 00000001
//	//-1的反码11111111 11111111 11111111 11111110
//	//-1的补码11111111 11111111 11111111 11111111
//
//	//1的补码/原码 00000000 00000000 00000000 00000001
//	//-1的补码     11111111 11111111 11111111 11111111
//    //补码相加     0000000 00000000 00000000 000000000
//	// 余0进1，多一位，由于int类型只能是32位，所以去掉符号位，最终结果为0
//
//
//	return 0;
//}


//大小端
//int main()
//{
//	int a = 20;
//	//00000000 00000000 00000000 00010100
//	//0x00 00 00 14
//    //高位      低位
//	
//	//大端存储-高位保存在低地址处
//	// 00  00  00  14
//	//低地址    高地址 
//	//小端存储-高位保存在高地址处
//	//14 00 00 00
//	//低地址    高地址 
//
//	//如何判断是大端存储还是小端存储？
//	//取第一个字节
//	return 0;
//}

//int check_sys()
//{
//	int a = 1;
//	if (*((char*)&a) == 1)
//	{
//		return 1;
//	}
//	else
//	{
//		return 0;
//	}
//}

//int check_sys()
//{
//	int a = 1;
//	return *((char*)&a);//返回1是小端，返回0是大端
//}
//
//int main()
//{
//	int a = 1;
//	//  0x00 00 00 01
//	//大端00 00 00 01
//	//小端01 00 00 00
//	//判断大端还是小端存储,只需要拿出第一个字节
//	//1.拿到a的地址
//	//2.将a的地址强转成char*类型指针
//	//3.解引用（拿出第一个字节）看是等于1还是0
//	int* pa = &a;
//	if (*((char*)pa) == 1)
//	{
//		printf("是小端存储");
//	}
//	else if(*((char*)pa) == 0)
//	{
//		printf("是大端存储");
//	}
//
//	if(check_sys() == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}

//int main()
//{
//	//1. 有符号整数提升是按照变量的数据类型的符号位来提升的
//	//2. ⽆符号整数提升，⾼位补0
//	char a = -1;//VS中是有符号的char
//	signed char b = -1;
//	unsigned char c = -1;
//
//	printf("a = %d , b = %d , c = %d\n", a, b, c);//-1 -1 超大的数
//
//	//原码 10000000 00000000 00000000 00000001
//	//反码 11111111 11111111 11111111 11111110
//	//补码 11111111 11111111 11111111 11111111
//	//内存中存储的是补码
//	// 由于char只能存1个字节，所以取低位的8个比特位11111111 - a
//	//a = %d---11111111 11111111 11111111 11111111补码，看结果看原码
//	//取反     10000000 00000000 00000000 00000000
//	//取反后+1 10000000 00000000 00000000 00000001
//	
//	
//	// %d打印的是有符号的整数，%u打印的是无符号的整数
//	//-1 -1  255
//
//	return 0;
//}

//int main()
//{
//	//%u 打印无符号整数，%u的角度，它认为内存中存储的是无符号的整数
//	char a = -128;//有符号的
//	printf("%u\n", a);//1
//
//	//-128的
//	// 原码10000000 00000000 00000000 10000000
//	// 反码11111111 11111111 11111111 01111111
//	// 补码11111111 11111111 11111111 10000000
//	// char a里存储的是 10000000
//	//整型提升后11111111 11111111 11111111 10000000
//	//由于%u认为它里面存的是无符号的整数，所以不用取反+1
//	//结果就为11111111 11111111 11111111 10000000
//
//	//%d打印
//	//10000000 00000000 00000000 01111111反码
//	//10000000 00000000 00000000 10000000原码
//	//-128
//	
//	return 0;
//}

//int main()
//{
//	char a = 128;
//	printf("%u\n", a);//4294967168
//	//原码00000000 00000000 00000000 10000000
//	//反码01111111 11111111 11111111 01111111
//	//补码01111111 11111111 11111111 10000000
//	//char a里存的是10000000
//	//有符号的char转整型，前面补符号位
//	//11111111 11111111 11111111 10000000
//	//%u默认存的是无符号的
//
//	return 0;
//}

//int main()
//{
//	signed int num = -10;
//	printf("%d\n", num);
//	//使用%d打印，认为内存中存的是有符号数
//	printf("%u\n", num);
//	//使用%u打印，认为内存中存的是无符号数
//	//与类型无关
//
//	return 0;
//}

//int main()
//{
//	char a[1000];
//	int i;
//	for (int i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%zd", strlen(a));//255
//
//	return 0;
//}

 //   数组名表示数组首元素的地址
	// strlen求的是字符串的长度，统计\0之前出现的字符个数

	//a[0] = -1 a[1] = -2 a[127] = -128
	//a[128] = 127 a[254] = 0，此后a[255]=-1……
	//strlen统计的是\0之前出现的字符个数，所以i=254=0这个数
 //   不统计。答案为255=127+128

//unsigned char i = 0;//全局变量
////0~255
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	
//	return 0;
//}
//结果：死循环打印
//unsigned char 是无符号字符型(0~255)
//for循环是条件为假才停止循环，但是无符号char取值只能在0~255

int main()
{
	unsigned int i;
	for (i = 0; i >= 0; i--)
	{
		printf("%u\n", i);
	}

	return 0;
}

//无符号int,能表示0和正整数
//题目中的条件始终为真
//结果一直打印无符号整数


